package com.dc.juc.example._2_sync;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * Description: synchronized 修饰 this 和 普通方法，锁的都是当前对象
 * @author: gdc
 * @date: 2021/7/28
 * @version 1.0
 */
@Slf4j
public class Synchronized1 {

    /**
     * 当前使用了两个对象，而锁也是锁在对象上，
     * 所以：
     *  结果是正常打印，但是多个线程的信息是错乱展示的
     */
    public static void main(String[] args){
        Synchronized1 sync1 = new Synchronized1();
        Synchronized1 sync2 = new Synchronized1();

        ExecutorService threadPool = Executors.newCachedThreadPool();
        threadPool.execute(() -> sync1.test1(0));
        threadPool.execute(() -> sync2.test2(0));
        threadPool.shutdown();
    }
/**
 * 打印信息 从 1 - 10
 *  synchronized (this) : 修饰的是当前的对象，锁的是当前对象
 */

    public void test1(int num) {
        synchronized (this) {
            for (int i = 1; i <= 10; i++) {
                log.info("test1 {}", ++num);
            }
        }
    }

    /**
     * 打印信息 从 1 - 10
     *  synchronized : 修饰的是当前的普通方法，锁的是当前的对象
     */
    public synchronized void test2(int num) {
        for (int i = 1; i <= 10; i++) {
            log.info("test2 {}", ++num);
        }
    }
}
